《Android 应用 之路》 天气预报(五)

前言

写了上一篇文章,讲了下这个实现天气预报的使用内容,现在又到了看代码的时候,主要还是贴代码,然后添加足够的注释。

聚合数据SDK配置

  • 将juhe_sdk_v_X_X.jar以及armeabi文件夹(内包含libJuheSDK_v_X_X.so)添加到工程中libs文件夹下
  • 打开Moudle setting -> app -> Dependencies,添加juhe_sdk_v_X_X.jar,
  • 在AndroidManifest.xml中,加入所需权限:
1
2
3
4
5
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • 添加所申请的openid(这个是在Juhe官网上申请的).在继承Application类之后, 在AndroidManifest.xml中,加入android:name属性,值为继承Application的类的路径.
  • 初始化聚合数据SDK
1
2
3
4
5
6
7
8
9
10
11
import android.app.Application;

public class MyApplication extends Application {

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
JuheSDKInitializer.initialize(getApplicationContext());
}
}

工程代码

MyApplication.java

1
2
3
4
5
6
7
8
9
10
11
package com.onlyloveyd.weather;
import android.app.Application;
import com.thinkland.sdk.android.JuheSDKInitializer;
public class MyApplication extends Application {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
JuheSDKInitializer.initialize(getApplicationContext());//初始化Juhe数据SDK
}
}

城市选择界面
ChooseCityActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.onlyloveyd.weather;
import ......;

public class ChooseCityActivity extends Activity {

public static final String TAG = "ChooseCityActivity";
@Bind(R.id.tv_choose_city_title)
TextView tvChooseCityTitle;
@Bind(R.id.et_search_city)
EditText etSearchCity;
@Bind(R.id.tv_hotcity)
TextView tvHotcity;
@Bind(R.id.gv_hotcity)
GridView gvHotcity;

private ArrayList<CityItem> mSupportCityList;//所有城市List
private ArrayList<CityItem> mSearchCityList;//城市查询结果List
private CityAdapter mCityAdapter;//城市GridView的Adapter

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.citylist);//城市选择界面
ButterKnife.bind(this);//依赖注入

mSupportCityList = new ArrayList<CityItem>();
mSearchCityList = new ArrayList<CityItem>();
//设置带shape模式的编辑框的背景颜色
//GradientDrawable myGrad = (GradientDrawable)mSearchEditView.getBackground();
//myGrad.setColor(getResources().getColor(R.color.choosecitysearchbackground));
//给城市名编译框添加文本变化的观察者
etSearchCity.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mSearchCityList.clear();//城市查询结果list清空
String searchkey = charSequence.toString();

Log.e(TAG, " city size " + mSupportCityList.size());
for (int j = 0; j < mSupportCityList.size(); j++) {
CityItem item = mSupportCityList.get(j);
if (searchkey.contains(item.getDistrict()) || item.getDistrict().contains(searchkey)) {//遍历查询
mSearchCityList.add(item);
}
}
mCityAdapter.setCityList(mSearchCityList);
mCityAdapter.notifyDataSetChanged();
}

@Override
public void afterTextChanged(Editable editable) {
}
});
mCityAdapter = new CityAdapter(this, mSupportCityList);
gvHotcity.setAdapter(mCityAdapter);
getSupportCity(this);
}

private void getSupportCity(Context context) {
/**Juhe SDK 封装的方法
* 请求的方法 参数: 第一个参数 当前请求的context 第二个参数 接口id 第三二个参数 接口请求的url 第 四个参数 接口请求的方式
* 第五个参数 接口请求的参数,键值对com.thinkland.sdk.android.Parameters类型; 第六个参数
* 请求的回调方法,com.thinkland.sdk.android.DataCallBack;
*
*/
JuheData.executeWithAPI(context, 39, "http://v.juhe.cn/weather/citys", JuheData.GET, null, new DataCallBack() {
@Override
public void onSuccess(int statusCode, String responseString) {
try {
//解析JSON数据
JSONObject jsonObject = new JSONObject(responseString);
JSONArray result = jsonObject.getJSONArray("result");
for (int i = 0; i < result.length(); i++) {
JSONObject object = (JSONObject) result.get(i);
CityItem item = new CityItem(object.getString("id"), object.getString("province"), object.getString("city"), object.getString("district"));
mSupportCityList.add(item);//查询结果添加
mCityAdapter.notifyDataSetChanged();//notify数据变化
}
} catch (JSONException e) {
e.printStackTrace();
}
}

@Override
public void onFinish() {
}

@Override
public void onFailure(int statusCode, String responseString, Throwable throwable) {
Log.e(TAG, responseString);
}
});
}

@Override
protected void onResume() {
super.onResume();
}

@Override
protected void onPause() {
etSearchCity.setText(null);//避免onBackPress的时候编辑框中还有数据
super.onPause();
}
}

聚合数据针对支持的城市返回的JSON数据格式为
{
“resultcode”:“200”,
“reason”:“successed”,
“result”:[ {
“id”:“1”, /城市ID/ “province”:“北京”,/省份名称/ “city”:“北京”, /城市/ “district”:“北京” /城市/区名称/ },
{
“id”:“2”,
“province”:“北京”,
“city”:“北京”,
“district”:“海淀”
},
}
}
按照这种格式解析出JSON数据

//天气显示界面
WeatherActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package com.onlyloveyd.weather;
import XXXX;

public class WeatherActivity extends Activity {

private static final String TAG = "MainActivity";
@Bind(R.id.imageview)
ImageView imageview;
@Bind(R.id.tv_cityname)
TextView tvCityname;
@Bind(R.id.tv_date)
TextView tvDate;
@Bind(R.id.iv_zhengfu)
ImageView ivZhengfu;
@Bind(R.id.iv_tenth)
ImageView ivTenth;
@Bind(R.id.iv_geth)
ImageView ivGeth;
@Bind(R.id.iv_du)
ImageView ivDu;
@Bind(R.id.iv_weather_fa)
ImageView ivWeatherFa;
@Bind(R.id.tv_weather)
TextView tvWeather;
@Bind(R.id.iv_weather_fb)
ImageView ivWeatherFb;
@Bind(R.id.tv_temp)
TextView tvTemp;
@Bind(R.id.tv_humidity)
TextView tvHumidity;
@Bind(R.id.tv_wind)
TextView tvWind;
@Bind(R.id.tv_refreshtime)
TextView tvRefreshtime;
@Bind(R.id.gv_future)
GridView gvFuture;
WeatherInfo.ResultBean.SkBean mSk;
WeatherInfo.ResultBean.TodayBean mToday;
FutureAdapter mFutureAdapter;
ArrayList<WeatherInfo.ResultBean.FutureBean> mFutureList;
private Context mContext;
private String mCityName = null;

/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mContext = this;

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.weather);
ButterKnife.bind(this);//依赖注入
Intent intent = getIntent();
mCityName = intent.getStringExtra("cityname");//从选择城市界面选择城市传递到这个Activity

mFutureList = new ArrayList<WeatherInfo.ResultBean.FutureBean>();//未来7天预报的List
mFutureAdapter = new FutureAdapter(this, mFutureList);//未来天气预报的GridView的Adapter
gvFuture.setAdapter(mFutureAdapter);
}

@Override
protected void onResume() {
super.onResume();
mFutureList.clear();
getWeatherInfoByCity(this, mCityName);//查询天气信息,包含的内容比较多,速度还算快,没有单独使用线程
tvCityname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onBackPressed();
}
});
}


private void getWeatherInfoByCity(Context context, String city) {

Log.e(TAG, "getWeatherInfoByCity");
Parameters param = new Parameters();
param.add("cityname", city);
param.add("format", 2);

JuheData.executeWithAPI(context, 39, "http://v.juhe.cn/weather/index", JuheData.GET, param, new DataCallBack() {
@Override
public void onSuccess(int statusCode, String responseString) {
Gson gson = new Gson();
try {
JSONObject jsonObject = new JSONObject(responseString);
JSONObject resultjson = jsonObject.getJSONObject("result");
JSONObject skjson = resultjson.getJSONObject("sk");
JSONObject todayjson = resultjson.getJSONObject("today");
JSONArray futurejson = resultjson.getJSONArray("future");
mSk = gson.fromJson(skjson.toString(), WeatherInfo.ResultBean.SkBean.class);
mToday = gson.fromJson(todayjson.toString(), WeatherInfo.ResultBean.TodayBean.class);
Log.e(TAG, futurejson.get(2).toString());
for (int i = 0; i < futurejson.length(); i++) {
WeatherInfo.ResultBean.FutureBean futureBean = gson.fromJson(futurejson.get(i).toString(), WeatherInfo.ResultBean.FutureBean.class);
Log.e(TAG, futureBean.toString());
mFutureList.add(futureBean);
}
mFutureAdapter.setmFutureList(mFutureList);
gvFuture.setAdapter(mFutureAdapter);
mFutureAdapter.notifyDataSetChanged();

tvCityname.setText(mCityName);
tvDate.setText(mToday.getDate_y() + " " + mToday.getWeek());
tvWeather.setText(mToday.getWeather());
tvTemp.setText(mToday.getTemperature());
tvHumidity.setText(mSk.getHumidity());
tvWind.setText(mSk.getWind_direction() + " " + mSk.getWind_strength());
tvRefreshtime.setText(getString(R.string.refreshtimesuffix) + mSk.getTime());

String fa = mToday.getWeather_id().getFa();
String fb = mToday.getWeather_id().getFb();
if (fa.equals(fb)) {
ivWeatherFa.setImageResource(getWeatherDrawableByWeatherId("w_", fa));
ivWeatherFb.setImageDrawable(null);
} else {
ivWeatherFa.setImageResource(getWeatherDrawableByWeatherId("w_", fa));
ivWeatherFb.setImageResource(getWeatherDrawableByWeatherId("w_", fb));
}

int tmp = Integer.valueOf(mSk.getTemp());
if (tmp < 0) {
ivZhengfu.setImageResource(R.drawable.fuhao);
int tenth = (0 - tmp) / 10;
int geth = (0 - tmp) % 10;
ivTenth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(tenth)));
ivGeth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(geth)));
} else {
ivZhengfu.setImageDrawable(null);
int tenth = tmp / 10;
int geth = tmp % 10;
ivTenth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(tenth)));
ivGeth.setImageResource(getWeatherDrawableByWeatherId("org4_widget_nw", String.valueOf(geth)));
}

} catch (JSONException e) {
e.printStackTrace();
}

}

@Override
public void onFinish() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "finish", Toast.LENGTH_SHORT).show();
}

@Override
public void onFailure(int statusCode, String responseString, Throwable throwable) {
// TODO Auto-generated method stub
Log.e(TAG, responseString);
}
});
}

private int getWeatherDrawableByWeatherId(String suffix, String fa) {
String res = suffix + fa;
int resid = getResources().getIdentifier(res, "drawable", getPackageName());
return resid;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
float startX = 0;

switch (action) {
case MotionEvent.ACTION_DOWN:
startX = event.getRawX();
break;
case MotionEvent.ACTION_UP:
float endX = event.getRawX();
if ((int) (endX - startX) > 10) {
onBackPressed();
}
break;
default:
break;
}

return true;
}
}

具体的内容请查阅源代码:

https://code.csdn.net/poorkick/weatherclient/tree/master

有看不懂的内容可以留言,晚上统一回复。
介绍一个Intellij插件 —– Gson Format, 通过Json格式快速生成Java Bean类,提高开发效率
其实有很多很好用的插件可供选择,不仅可以提高效率,还可以增加自己对开发的兴趣,可以去多了解一下。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×